package com.on.smile.util;

import org.apache.commons.codec.digest.DigestUtils;

import java.io.UnsupportedEncodingException;

/**
 * @author Smile.Gong
 * @date 2025/6/21 12:08
 */
public class MD5Utils {


    /**
     * 基础MD5加密（无盐值）
     * @param content 待加密字符串
     * @return 32位小写MD5值
     */
    public static String encrypt(String content) {
        return DigestUtils.md5Hex(getContentBytes(content, "UTF-8"));
    }

    /**
     * 带盐值的MD5加密
     * @param content 原始内容
     * @param salt 盐值
     * @return 加盐后的MD5值
     */
    public static String encryptWithSalt(String content, String salt) {
        content = content + salt;
        return DigestUtils.md5Hex(getContentBytes(content, "UTF-8"));
    }

    /**
     * 验证MD5签名
     * @param content 原始内容
     * @param md5Value 待验证的MD5值
     * @param salt 盐值（可为空）
     * @return 验证结果
     */
    public static boolean verify(String content, String md5Value, String salt) {
        String realMd5 = (salt == null) ? encrypt(content) : encryptWithSalt(content, salt);
        return realMd5.equals(md5Value);
    }

    private static byte[] getContentBytes(String content, String charset) {
        try {
            return content.getBytes(charset);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("不支持的编码格式: " + charset);
        }
    }

    // 测试用例
    public static void main(String[] args) {
        String plainText = "HelloWorld123";
        System.out.println("MD5加密结果: " + encrypt(plainText));

        String salt = "abc@2025";
        String saltedMd5 = encryptWithSalt(plainText, salt);
        System.out.println("加盐MD5结果: " + saltedMd5);
        System.out.println("验证结果: " + verify(plainText, saltedMd5, salt));
    }

}
